Nahrazeni textu v binarnim souboru ?

Otázka od: Jiri Betunak

21. 4. 2004 7:34

Zdravim konference,
potreboval bych poradit viz %subj%
resim to takto ale je to opravdu ale opravdu pomale ,neynate nekdo
prosim rychlejsi spusob ?

Procedure FileReplaceString(Const FileName, SearchString, ReplaceString:
  String);
Var
  fs: TFileStream;
  pos: Integer;
  b: Byte;
Begin
  Pos := 1;
  fs := TFileStream.Create(FileName, fmOpenReadWrite Or fmShareDenyNone);
form1.ProgressBar1.Max:=fs.Size;
  Try
 fs.Position:=0;
     While fs.Position < fs.Size Do
      Begin
        form1.ProgressBar1.Position:=fs.Position;
        form1.Label6.Caption:=inttostr(fs.Position)+'/'+inttostr(fs.Size);
        Application.ProcessMessages;

        fs.Read(b, 1);
          If b = ord(SearchString[Pos]) Then
            Begin

              Inc(Pos);
              If Pos - 1 = Length(SearchString) Then
                Begin
                    // Nasel
                  fs.Seek(-(Length(SearchString)), soFromCurrent);
                  fs.Write(ReplaceString[1], Length(ReplaceString));
                  Pos := 1;
                End;
            End
          Else
            Begin
              Pos := 1;
            End;
      End;
  Finally
    fs.Free;
  End;
End;


Predem diky za jakoukoliv pomoc

--
Best regards,
 Jiri mailto:kindrik@centrum.cz

ICQ: 265297587

__________________________________________________________________


Odpovedá: Tyslic Jiri

21. 4. 2004 7:55

Rekl bych, ze Application.ProcessMessages bych nevolal urcite pri kazdem
pruchodu, ale treba kazdy 10pruchod (cim mene, tim lepe). Ale to asi nebude ta
hlavni brzda...

Jirka


> -----Original Message-----
> From: Jiri Betunak [mailto:kindrik@centrum.cz]
> Sent: Wednesday, April 21, 2004 8:34 AM
> To: delphi-l@clexpert.cz
> Subject: Nahrazeni textu v binarnim souboru ?
>
>
> Zdravim konference,
> potreboval bych poradit viz %subj%
> resim to takto ale je to opravdu ale opravdu pomale ,neynate
> nekdo prosim rychlejsi spusob ?
>
> Procedure FileReplaceString(Const FileName, SearchString,
> ReplaceString:
> String);
> Var
> fs: TFileStream;
> pos: Integer;
> b: Byte;
> Begin
> Pos := 1;
> fs := TFileStream.Create(FileName, fmOpenReadWrite Or
> fmShareDenyNone); form1.ProgressBar1.Max:=fs.Size;
> Try
> fs.Position:=0;
> While fs.Position < fs.Size Do
> Begin
> form1.ProgressBar1.Position:=fs.Position;
>
> form1.Label6.Caption:=inttostr(fs.Position)+'/'+inttostr(fs.Size);
> Application.ProcessMessages;
>
> fs.Read(b, 1);
> If b = ord(SearchString[Pos]) Then
> Begin
>
> Inc(Pos);
> If Pos - 1 = Length(SearchString) Then
> Begin
> // Nasel
> fs.Seek(-(Length(SearchString)), soFromCurrent);
> fs.Write(ReplaceString[1], Length(ReplaceString));
> Pos := 1;
> End;
> End
> Else
> Begin
> Pos := 1;
> End;
> End;
> Finally
> fs.Free;
> End;
> End;


Odpovedá: Jiri Betunak

21. 4. 2004 8:53

Hello jiri,


>Rekl bych, ze Application.ProcessMessages .........
> ale treba kazdy 10pruchod (cim mene, tim
>lepe). Ale to asi nebude ta hlavni brzda...

 No brzda to je ale i kdyz ho nevolam tak to je stejne pomale
 napr 600kb soubor to prochazi (na 1200 celer) zhruba 7minut !

--
Best regards,
 Jiri mailto:kindrik@centrum.cz


Odpovedá: Tyslic Jiri

21. 4. 2004 8:51

Mozna placnu hloupost, ale
1. zkusit pri tak malem souboru nacist stream do pameti a vsechno delat v
pameti?
2. nenacitat ze soubory po jednom znaku, ale vzdy blok dat (omezeni I/O
operaci)

Jirka

> -----Original Message-----
> From: Jiri Betunak [mailto:kindrik@centrum.cz]
> Sent: Wednesday, April 21, 2004 9:13 AM
> To: delphi-l@clexpert.cz
> Subject: Re: Nahrazeni textu v binarnim souboru ?
>
>
> Hello jiri,
>
>
> >Rekl bych, ze Application.ProcessMessages .........
> > ale treba kazdy 10pruchod (cim mene, tim
> >lepe). Ale to asi nebude ta hlavni brzda...
>
> No brzda to je ale i kdyz ho nevolam tak to je stejne pomale
> napr 600kb soubor to prochazi (na 1200 celer) zhruba 7minut !
>
> --
> Best regards,
> Jiri mailto:kindrik@centrum.cz
>
>
>
>
>


Odpovedá: delphin@post.cz

21. 4. 2004 9:34

Melo by pomoct:
- nacist najednou cely soubor do pameti
- vyhledavat pomoci SearchBuf


Odpovedá: Jiri Betunak

21. 4. 2004 9:48

Hello delphin,

dpc> Melo by pomoct:
dpc> - nacist najednou cely soubor do pameti
dpc> - vyhledavat pomoci SearchBuf


jj to ja vim ale nevim jak to udelat nebyl by prikladek


--
Best regards,
 Jiri mailto:kindrik@centrum.cz


Odpovedá: Dalibor Faltynek

21. 4. 2004 9:55

Ahoj,
nejsem sice zadny expert, ale zkusil bych nacist vzdycky blok dat do
dlooouheho stringu, na to aplikovat funkci pro praci s podretezci POS, DEL a
INSERT. Predpokladam, ze tyto fce budou v delfi optimalizovane na rychlost
vic, nez kdyz to budes delat pesky vlastnim kodem. Akorat musis pohlidat,
abys dalsi blok dat nacital od pozice - delka hledaneho stringu. A rekl
bych, ze muzes pouzit ke cteni a zapisu blokove operace pascalu, nebo
streamy, to je burt.

Zdravi Dalik.

----- Original Message -----
From: Jiri Betunak <kindrik@centrum.cz>
To: <delphi-l@clexpert.cz>
Sent: Wednesday, April 21, 2004 8:34 AM
Subject: Nahrazeni textu v binarnim souboru ?


> Zdravim konference,
> potreboval bych poradit viz %subj%
> resim to takto ale je to opravdu ale opravdu pomale ,neynate nekdo
> prosim rychlejsi spusob ?
>
> Procedure FileReplaceString(Const FileName, SearchString, ReplaceString:
> String);
> Var
> fs: TFileStream;
> pos: Integer;
> b: Byte;
> Begin
> Pos := 1;
> fs := TFileStream.Create(FileName, fmOpenReadWrite Or fmShareDenyNone);
> form1.ProgressBar1.Max:=fs.Size;
> Try
> fs.Position:=0;
> While fs.Position < fs.Size Do
> Begin
> form1.ProgressBar1.Position:=fs.Position;
> form1.Label6.Caption:=inttostr(fs.Position)+'/'+inttostr(fs.Size);
> Application.ProcessMessages;
>
> fs.Read(b, 1);
> If b = ord(SearchString[Pos]) Then
> Begin
>
> Inc(Pos);
> If Pos - 1 = Length(SearchString) Then
> Begin
> // Nasel
> fs.Seek(-(Length(SearchString)), soFromCurrent);
> fs.Write(ReplaceString[1], Length(ReplaceString));
> Pos := 1;
> End;
> End
> Else
> Begin
> Pos := 1;
> End;
> End;
> Finally
> fs.Free;
> End;
> End;
>
>
> Predem diky za jakoukoliv pomoc
>
> --
> Best regards,
> Jiri mailto:kindrik@centrum.cz
>
> ICQ: 265297587
>
> __________________________________________________________________
>
>
>
>